#ifndef RT_OBJETO
#define RT_OBJETO

#include <math.h>
#include "color.h"
#include "vector.h"
#include "matrix3d.h"
#include "ray.h"
#include "intersect.h"

#define DEG2RAD(deg) ((deg * M_PI)/180.0)
#define RAD2DEG(rad) ((rad * 180.0)/M_PI)
class Object {
	public:
	Color *cor;
	Matrix3D *orientacao;
	Vector *posicao;
	float kAmbiente;
	float kDifusa;
	int nShing;
	float kEspecular;
	
	/**
	* Inicializa o objeto com a cor branca, posicao 0,0,0, kDifusa,kReflexao e nShing com 
	* valores quaisquer (não aleatorio)
	*/
	Object();
	/**
	* Inicializa o objeto com os parâmetros passados
	* E seta a orientação sem rotacao no eixo X, Y e Z
	*/
	Object(Color *cor,Vector *posicao,double kAmbiente,double kDifusa, double kEspecular,int nShing);
	/**
	* Deve destruir os objetos armazenados
	*/
	~Object();

	/**
	* retorna a posicao do objeto
	*/
	Vector* getPosicao();

	/**
	* seta a posicao do objeto
	*/

	void setPosicao(Vector *p);
	/*
	deve retornar true ou false, caso deve testar colis�o neste objeto
	*/
	bool testarColisao(Ray *raio);
	/*
	deve retornar o raio normal a intersec��o entre o raio passado e o objeto
	caso o raio n�o intersect o objeto, deve retornar null
	Esse método deve ser implementado nas classes filhas
	*/
	Vector* vetorNormal(Ray *raio);//metodo nao utilizado
	
	/* retorna um objeto Intersect caso o raio intersect o objeto
	* caso contrario retorna NULL
	*/
	virtual Intersect* intersecsao(Ray *raio);
	
	Color* calcularCor(Object *objeto,Vector *normal);

	/*
 	* Rotaciona o objeto em x,y e z GRAUS
  	*/
	void rotacionar(double x, double y, double z);

	/*
 	 * Desloca o objeto no mundo
 	*/
	void deslocar(double x, double y, double z);
};

#include "object.cpp"

#endif
